// database/mysql.go
package database

import (
	"fmt"

	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// DB 包含数据库连接和 gorm.DB 实例
type DB struct {
	Config DBConfig
	Conn   *gorm.DB
}

// NewDB 创建一个新的数据库实例
func NewDB(config DBConfig) *DB {
	return &DB{
		Config: config,
	}
}

// Connect 连接到数据库
func (db *DB) connect() error {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true", db.Config.Username, db.Config.Password, db.Config.Host, db.Config.Port, db.Config.DBName)
	conn, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		return err
	}
	db.Conn = conn
	return nil
}

// 未完成不要紧，考虑到配置文件很不错
// 时间不够了 本来想把配置放到文件中 然后通过viper读取的  暂时先这样
func GetDb() (*DB, error) {
	// config := DBConfig{
	// 	Username: "root",
	// 	Password: "qiKAI!!395166",
	// 	Host:     "rm-bp13i71cqtb0f0b5nyo.mysql.rds.aliyuncs.com",
	// 	Port:     "3306",
	// 	DBName:   "test",
	// }

	// 初始化 Viper
	viper.SetConfigFile("database/config.yaml")
	err := viper.ReadInConfig()
	if err != nil {
		fmt.Println("Error reading config file:", err)
	}
	var dbConfig DBConfig
	err = viper.UnmarshalKey("database", &dbConfig)
	if err != nil {
		fmt.Println("Error unmarshaling database config:", err)
	}
	db := NewDB(dbConfig)
	err = db.connect()
	return db, err
}
